# Python 生成器
# 生成器是一种特殊的迭代器，它可以生成一系列值，但不必一次性生成所有值。
# 生成器函数使用 yield 语句来返回一个值，而调用生成器函数时，函数会暂停并保存当前的状态，
# 等下一次需要使用生成器的地方再继续执行。
# 生成器函数只能用于迭代操作，不能用于切片操作。

# 定义一个生成器函数
def my_generator():
    for i in range(10):
        yield i * i

# 调用生成器函数返回一个生成器对象
gen = my_generator()
# 迭代生成器
for i in gen:
    print("gen:", i)
# 输出结果：
# 0
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64
# 81

# 定义一个生成器函数，使用 yield from 语句来返回另一个生成器
def my_generator2():
    for i in range(5):
        yield from range(i)     # 注意这里使用了 yield from 语句, 它可以将另一个生成器的值返回给调用者

# 调用生成器函数返回一个生成器对象
gen2 = my_generator2()
# 迭代生成器
for i in gen2:
    print("gen2:", i)
# 输出结果：
# 0
# 0
# 1
# 0
# 1
# 2
# 0
# 1
# 2
# 3


# 定义一个生成器函数，使用 while 语句来实现递减的数值
def my_generator3(n):
    while n > 0:
        yield n
        n -= 1
# 调用生成器函数返回一个生成器对象
gen3 = my_generator3(5)
# 迭代生成器
for i in gen3:
    print("gen3:", i)
# 输出结果：
# 5
# 4
# 3
# 2
